package com.mango.community.service;

import com.mango.community.util.RedisKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.core.RedisOperations;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.SessionCallback;
import org.springframework.stereotype.Service;

/**
 * @Author:  MangoCookieMilk
 * @Date:     2020/8/15 23:40
 * 点赞的service
 */
@Service
public class LikeService {

    /**
     * 注入redis
     */
    @Autowired
    private RedisTemplate redisTemplate;

    /** 点赞的方法
     * @param userId 用户的id
     * @param entityType  实体的类型（帖子还是）
     * @param entityId 实体的id
     * @param entityUserId
     */
    public void like(int userId, int entityType,int entityId,int entityUserId){
       //redis 保证事务的方式 --- 编程式事务
       redisTemplate.execute(new SessionCallback() {
           @Override
           public Object execute(RedisOperations operations) throws DataAccessException {
               //点赞的key
               String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType, entityId);
               //用户的点赞的key
               String userLikeKey = RedisKeyUtil.getUserLikeKey(entityUserId);
               //判断该key是否在集合中 看他是点过赞还是没有点过
               Boolean isNumber = operations.opsForSet().isMember(entityLikeKey,userId);
               //开启redis的事务
               operations.multi();
                if(isNumber){
                    //点过赞了，从集合中删除
                    operations.opsForSet().remove(entityLikeKey,userId);
                    //让用户获取到的赞数减一
                    operations.opsForValue().decrement(userLikeKey);
                }else {
                    //往集合中添加数据
                    operations.opsForSet().add(entityLikeKey,userId);
                    //让用户获取到的赞数加一
                    operations.opsForValue().increment(userLikeKey);
                }
               //执行redis的事务
               return operations.exec();
           }
       });
    }

    /** 查询某个实体点赞的数量
     * @param entityType
     * @param entityId
     * @return
     */
    public long findEntityLikeCount(int entityType,int entityId){
        //点赞的key
        String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        //统计这个key对应的集合中的数量
        return redisTemplate.opsForSet().size(entityLikeKey);
    }

    /** 查询某人对某实体的点赞的状态
     * @param userId
     * @param entityType
     * @param entityId
     * @return
     */
    public int findEntityLikeStatus(int userId,int entityType,int entityId){
        //点赞的key
        String entityLikeKey= RedisKeyUtil.getEntityLikeKey(entityType, entityId);
        //返回1 点赞， 返回0 没有点赞
        return redisTemplate.opsForSet().isMember(entityLikeKey,userId) ? 1 : 0;
    }

    /** 查询某个用户获得赞的数量
     * @param userId
     * @return
     */
    public int findUserLikeCount(int userId){
        //用户的点赞的key
        String userLikeKey = RedisKeyUtil.getUserLikeKey(userId);
        //查询出数量
        Integer count = (Integer) redisTemplate.opsForValue().get(userLikeKey);
        //返回数据，不为空时返回数据的整数形式
        return count  == null ? 0 : count.intValue();
    }
}
